<?php

declare (strict_types = 1);

namespace own\enum;

use think\facade\Config;

class FileEnum
{   
    private $config;
    private $root; //存储文件目录

    // 文件类型
    const TEMP = 'temp'; //临时文件
    const AVATAR = 'avatar'; //头像
    const QRCODE = 'qrcode'; //二维码
    const IMAGES = 'images'; //图片
    const VIDEO = 'video'; //视频
    const MP3 = 'mp3'; //mp3
    const FILES = 'files'; //其他文件

    public function __construct()
    {
        $this->config = Config::get('filesystem');
    }
    /**
     * 存储文件目录
     */
    private function rootPath($name = '')
    {
        $disks = $this->config['disks'][$this->config['default']];
        if(!$name) {
            $name = self::IMAGES;
        }
        $fileDir = $disks['root'] . DIRECTORY_SEPARATOR . $name. DIRECTORY_SEPARATOR . date('Ym');
        if (!file_exists($fileDir)) {
            FileEnum::mkdir($fileDir);
        }
        $this->root = $fileDir . DIRECTORY_SEPARATOR;
    }
    /**
     * 文件保存路径
     */
    private function filePath(): string
    {
        $path = match($this->config['default']) {
            'local' => app()->getRuntimePath(),
            'public' => app()->getRootPath() . 'public/',
            default => ''
        };
        return str_replace($path, '', $this->root);
    }   
    /**
     * 创建目录
     * @param string $path
     * @param string $mode  
     */
    public static function mkdir(string $path, int $mode = 0777): bool
    {
        if (is_dir($path) || mkdir($path, $mode, true)) {
            return true;
        }
        tips('创建目录失败');
    }
    /**
     * 有效文件路径文件名
     * @param string $exts 文件后缀名，如： .png
     * @param string $type 存储文件件类型
     * @param string $prefix 文件名前缀
     */
    public function storageName(string $exts, $type = '', $prefix = ''): array
    {
        $this->rootPath($type);
        $fileName = $prefix . date('YmdHis') . mt_rand(1, 9999). $exts;
        //绝对路径、相对路径
        return [$this->root . $fileName, $this->filePath() . $fileName];
    }
}
